namespace DefaultNamespace
{
    
    /**
     *
     * 给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。

        如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
        
        您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
        
        示例：
        
        输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
        输出：7 -> 0 -> 8
        原因：342 + 465 = 807
        
        来源：力扣（LeetCode）
        链接：https://leetcode-cn.com/problems/add-two-numbers
        著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
        
        
        //原始加减法  可用于数据长时  超过了int范围
     */
    
    public class ListNode 
    {
        public int val;
        public ListNode next;
        public ListNode(int x) 
        { val = x; }
    }
    
    public class TwoSum
    {
        public ListNode AddTwoNumbers(ListNode l1, ListNode l2)
        {
            int sum = l1.val + l2.val;
            
            ListNode result = new ListNode(sum);

            ListNode cur1 = l1.next;

            ListNode cur2 = l2.next;

            int nextCum = 0;

            while (cur1 != null || l2 !=null)
            {
                int sum1 = 0;
                int sum2 = 0;

                if (cur1.next != null)
                {
                    sum1 = cur1.val;
                    cur1 = cur1.next;
                }

                if (cur2.next != null)
                {
                    sum2 = cur2.val;
                    cur2 = cur2.next;
                }

                int consume = sum1 + sum2 + nextCum;
                nextCum =consume/10;

                result.next = new ListNode(consume%10);
            }

            if (nextCum != 0)
            {
                result.next = new ListNode(nextCum); 
            }
            return result;
        }
    }
}